Communications protocol processing, such as for encryption, compression, or datapath processing typically involves a high-level multi-threaded computational engine issuing jobs having communication processing tasks to lower-level processors. These lower-level processors utilize a common set of specialized coprocessors that process the communications data. Each processing thread provides a unique set of tasks that are to be processed, and processing each of the tasks may utilize a subset of the specialized coprocessors.
Because there are typically not enough lower-level processors and coprocessors to perfectly match the number of tasks to perform, these resources (i.e., processors and coprocessors) should be fairly allocated so that the high-level multi-threaded computational engine can finish its tasks. The typical solution to this fair allocation of resources is to use a dedicated processor thread to manage these resources. The dedicated processor thread allocates a new thread's job when a number of jobs in an incoming queue falls below a threshold value. This traditional solution utilizes an expensive higher-level thread and also produces a delayed response to lower-level resources becoming available.